// package main

// import (
// 	"fmt"
// 	"net/http"
// 	"time"

// 	"github.com/gin-gonic/gin"
// )

// //Gin框架允许开发者在处理请求的过程中，加入用户自己的钩子(Hook)函数。
// //这个钩子函数就叫中间件中间件适合处理一些公共的业务逻辑，
// //比如登录认证、权限校验、数据分页、记录日志、耗时统计等。

// // handlerFunc
// func indexHandler(c *gin.Context) {
// 	fmt.Println("indexHandler in ...")

// 	//获取上下文的值(跨中间件取值)
// 	name, ok := c.Get("name")
// 	if !ok {
// 		name = "匿名用户"
// 	}

// 	c.JSON(http.StatusOK, gin.H{
// 		"name":name,
// 	})
// }

// // 定义一个中间件m1：统计耗时
// func m1(c *gin.Context){
// 	fmt.Println("m1 in ...")

// 	c.Next()  // 调用后续的处理函数
// 	// c.Abort() // 阻止调用后续的处理函数

// 	// 计时
// 	start := time.Now()
// 	cost := time.Since(start)
// 	fmt.Printf("cost:%v\n",cost)
// 	fmt.Println("m1 out ...")
// }

// func m2(c *gin.Context){
// 	fmt.Println("m2 in ...")

// 	//获取某些信息后，设置到上下文context中
// 	c.Set("name", "qimi")

// 	c.Next()  // 调用后续的处理函数
// 	// c.Abort()
// 	// return  //下一句不会执行
// 	fmt.Println("m2 out ...")
// }

// // func authMiddleware(c *gin.Context){
// // 	// 是否登录的判断
// // 	// if 是登录用户
// // 	// c.Next()
// // 	// else
// // 	// c.Abort()
// // }

// //通常使用 闭包 写 中间件
// func authMiddleware(docheck bool)gin.HandlerFunc{
// 	// 连接数据库
// 	// 或一些其他工作

// 	return func (c *gin.Context){
// 		if docheck{
// 			// 是否登录的判断
// 			// if 是登录用户
// 			// c.Next()
// 			// else
// 			// c.Abort()
// 		}else{
// 			c.Next()
// 		}
// 	}
// }

// func main() {
// 	r := gin.Default()

// 	r.Use(m1, m2, authMiddleware((true))) //全局注册中间件函数m1
// 	//这样就变成了：m1->m2->index->m2->m1

// 	// GET(relativePath string,handlers ...HandlerFunc)IRoutes {
// 	// 先走m1，再走indexHandler
// 	r.GET("/index", m1, indexHandler)

// 	r.GET("/shop", func(c *gin.Context) {
// 		c.JSON(http.StatusOK, gin.H{
// 			"msg":"user",
// 		})
// 	})

// 	//为路由组注册中间件：方法1
// 	xxGroup := r.Group("/xx", authMiddleware(true))
// 	{
// 		xxGroup.GET("/index", func(c *gin.Context) {
// 			c.JSON(http.StatusOK, gin.H{
// 				"msg":"xxGroup",
// 			})
// 		})
// 	}

// 	//为路由组注册中间件：方法2
// 	xx2Group := r.Group("/xx2")
// 	xx2Group.Use(authMiddleware(true))
// 	{
// 		xx2Group.GET("/index", func(c *gin.Context) {
// 			c.JSON(http.StatusOK, gin.H{
// 				"msg":"xx2Group",
// 			})
// 		})
// 	}



// 	r.Run(":9090")
// }